AWS SDK for Go でビルドしたバイナリをCentOS5で試してみた
はじめに
AWSチームのすずきです。
GoogleよりOSSとして提供されている、シンプルで並列処理に強いプログラミング言語とされるGo。 先日、AWS SDK for Goがデベロッパープレビューとして公開され、弊社ブログでも紹介させて頂いています。
AWS SDK for GoとIAMRoleを活用してLinux/Windows両対応のスクリプトを作成する
Go言語、ビルドにより1つのバイナリファイルが生成され、ライブラリを意識する事なく別環境に流用できる特徴があります。
今回、AmazonLinux上でビルドしたAWS SDK for Goを利用してEC2のAPIを実行するバイナリファイルを、 少し古めのOS環境(CentOS 5.10、Ubuntu 12.04)にコピーして、その実行可否を試してみました。
ビルド
OS情報
- OS Amazon Linux 2014.09.2
- AMI amzn-ami-hvm-2014.09.2.x86_64-ebs (ami-dfc39aef:us-west-2)
環境構築(Go)
Go go version go1.3.3 linux/amd64
sudo yum -y install golang mkdir go echo 'export GOPATH=$HOME/go' >> ~/.bash_profile echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bash_profile source ~/.bash_profile go get github.com/awslabs/aws-sdk-go/gen/ec2 go version
検証用ソース生成1
AWS SDK for Go ファーストインプレッション より
cat << EOF > test-ec2.go package main import ( "fmt" "os" "github.com/awslabs/aws-sdk-go/aws" "github.com/awslabs/aws-sdk-go/gen/ec2" ) func main() { accessKey := os.Getenv("AWS_ACCESS_KEY_ID") secretKey := os.Getenv("AWS_SECRET_ACCESS_KEY") defaultRegion := os.Getenv("AWS_DEFAULT_REGION") if accessKey == "" || secretKey == "" || defaultRegion == "" { fmt.Println("Error: Undefined AWS_ACCESS_KEY_ID or AWS_SECRET_ACCESS_KEY or AWS_DEFAULT_REGION") os.Exit(9) } creds := aws.Creds(accessKey, secretKey, "") cli := ec2.New(creds, defaultRegion, nil) resp, err := cli.DescribeInstances(nil) if err != nil { panic(err) } if len(resp.Reservations) < 1 { return } for i := range resp.Reservations { fmt.Print(i) fmt.Print(" , ") fmt.Print(*resp.Reservations[i].Instances[0].VPCID) fmt.Print(" , ") fmt.Print(*resp.Reservations[i].Instances[0].SubnetID) fmt.Print(" , ") fmt.Print(*resp.Reservations[i].Instances[0].InstanceID) fmt.Print(" , ") fmt.Print(*resp.Reservations[i].Instances[0].InstanceType) fmt.Print(" , ") fmt.Println(*resp.Reservations[i].Instances[0].ImageID) } } EOF
検証用ソース生成2
AWS SDK for GoとIAMRoleを活用してLinux/Windows両対応のスクリプトを作成する より
cat << EOF > test-ec2-role.go package main import ( "fmt" "net/http" "io/ioutil" "github.com/awslabs/aws-sdk-go/aws" "github.com/awslabs/aws-sdk-go/gen/ec2" ) func main() { creds := aws.IAMCreds() cli := ec2.New(creds,getRegion(),nil) resp, err := cli.DescribeInstances(nil) if err != nil { panic(err) } if len(resp.Reservations) < 1 { return } for i := range resp.Reservations { fmt.Print(i) fmt.Print(" , ") fmt.Print(*resp.Reservations[i].Instances[0].VPCID) fmt.Print(" , ") fmt.Print(*resp.Reservations[i].Instances[0].SubnetID) fmt.Print(" , ") fmt.Print(*resp.Reservations[i].Instances[0].InstanceID) fmt.Print(" , ") fmt.Print(*resp.Reservations[i].Instances[0].InstanceType) fmt.Print(" , ") fmt.Println(*resp.Reservations[i].Instances[0].ImageID) } } func getRegion()(string){ url := "http://169.254.169.254/latest/meta-data//placement/availability-zone" r,_ := http.Get(url) defer r.Body.Close() byteArray, _ := ioutil.ReadAll(r.Body) str := string(byteArray) size := len(str) return str[0:size-1] } EOF
ビルド
go build test-ec2.go go build test-ec2-role.go
実行検証
CentOS-5.10-x86_64
- AMI Datapipe-CentOS-5.10-x86_64 (ami-fc640acc:us-west-2)
Ubuntu 12.04 LTS-x86_64
- ubuntu-precise-12.04-amd64-server-20140927 (ami-07470537c:us-west-2)
共通
- インスタンス:t1.micro
- EC2ロール:EC2権限ロールを事前用意して、EC2インスタンスの起動時に付与する
- IAMユーザ:EC2権限を有すIAMユーザを作成、アクセスキー、シークレットキーを用意する
- Goバイナリファイル:ビルド環境で生成したファイルは、S3、SSH等を利用して事前に実行環境のローカルに転送し、実行権限を付与する
- パッケージ:追加なし(AMI起動直後のままとする)
実行結果
CentOS-5.10-x86_64
- AMI Datapipe-CentOS-5.10-x86_64 (ami-fc640acc:us-west-2)
OS情報確認
# cat /etc/redhat-release CentOS release 5.10 (Final) # uname -a Linux ip-172-31-21-211 2.6.18-371.4.1.el5xen #1 SMP Thu Jan 30 06:58:16 EST 2014 x86_64 x86_64 x86_64 GNU/Linux
サンプル1
$ export AWS_ACCESS_KEY_ID="aaaaaaaaaaaaaaaaaaaa" $ export AWS_SECRET_ACCESS_KEY="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" $ export AWS_DEFAULT_REGION="us-west-2" $ ./test-ec2 0 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-fc640acc 1 , vpc-00000000 , subnet-00000000 , i-00000000 , t2.micro , ami-dfc39aef 2 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-07470537
サンプル2
$ ./test-ec2-role 0 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-fc640acc 1 , vpc-00000000 , subnet-00000000 , i-00000000 , t2.micro , ami-dfc39aef 2 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-07470537
<h4>Ubuntu 12.04
<h5>OS情報確認
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=12.04 DISTRIB_CODENAME=precise DISTRIB_DESCRIPTION="Ubuntu 12.04.5 LTS" $ uname -a Linux ip-172-31-21-13 3.2.0-69-virtual #103-Ubuntu SMP Tue Sep 2 05:21:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
サンプル1
$ export AWS_ACCESS_KEY_ID="aaaaaaaaaaaaaaaaaaaa" $ export AWS_SECRET_ACCESS_KEY="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" $ export AWS_DEFAULT_REGION="us-west-2" $ ./test-ec2 0 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-fc640acc 1 , vpc-00000000 , subnet-00000000 , i-00000000 , t2.micro , ami-dfc39aef 2 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-07470537
サンプル2
$ ./test-ec2-role 0 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-fc640acc 1 , vpc-00000000 , subnet-00000000 , i-00000000 , t2.micro , ami-dfc39aef 2 , vpc-00000000 , subnet-00000000 , i-00000000 , t1.micro , ami-07470537
まとめ
AmazonLinux上でビルドした、AWS SDK for Goを利用するバイナリファイル、 AWS SDKを始めとする開発環境を導入していない素のCentOS 5.10、Ubuntu 12.04でも実行する事ができました。
アプリの実行環境と干渉するなどの理由によりSDKやAWS CLIの導入が難しい事がありますが、 このような場合でも、AWSのAPIを実行する事が可能となる可能性のあるAWS SDK for Go。その正式リリースを心待ちにしたいと思います。